package main
import "fmt"

/**
【1】管道(channel)特质介绍
	1. 管道本质就是一个数据结构-队列
	2. 数据是先进先出
 	3. 自身线程安全，多协程访问时，不需要加锁，channel本身就是线程安全的
			多个协程操作同一个管道时，不会发生资源争抢
	4. 管道有类型的，一个string的管道界能存放string类型数据 

【2】 管道的定义: 
		var 变量名 chan 数据类型
	1. chan管道关键字
	2. 数据类型指的是管道的类型，里面放入数据的类型，管道是有类型的，int类型的管道Chan只能写入整数
	3. 管道是引用类型，必须初始化才能写入数据，即make后才能使用
**/


func main() {
	test()
}

func test() {
	// 声明一个管道 --》 定义一个int类型的管道
	var intChan chan int
	// 通过make初始化管道：管道可以存放3个int类型的数据
	intChan = make(chan int,3)

	// 证明管道是引用类型 ： 打印结果是一个指针（内存地址）0xc000020100
	fmt.Printf("intChan: %v\n",intChan)

	// 写入数据到管道
	intChan <- 12
	num := 10
	intChan <- num

	// 注意:在没有使用协程的情况下，如果管道的数据已经全部取出，那么再取就会报错
	get := <- intChan

	// 输出管道的长度
	fmt.Println("管道的长度：",len(intChan))
	fmt.Println("管道的容量：",cap(intChan))
	fmt.Println("管道的值：", intChan)
	//fmt.Printf("管道的值： %v \n", *intChan)
	fmt.Println(get)
	
}